package xian.woniuxy.zh_generic.f;

/*
    e包中，提到了java的泛型，是伪泛型
    1： 编译期有泛型信息，编译后，运行时没有泛型信息，所以无法调用泛型的方法
    2： 伪泛型就是为了向前兼容

    我们就想调用泛型的方法，怎么办？ 参考本例Foo<T extends A>
 */

class A {
    void f1() {

    }
}
class B extends A {
    void f2() {

    }
}

class C extends B {
    void f3() {

    }
}

class D extends C {
    void f4() {

    }
}

class E extends D {
    void f5() {

    }
}

/*
    在定义类的时候，同时定义泛型的时候，可以写成： T extends A
    1. 这样写的作用，就是擦除时，不再使用Object替换T了，而是使用A替换T
    2. 这样写的作用，限制了传入的实际类型参数只能是A或A的子类
 */

class Foo<T extends C> {
    private T a;
    private T b;

    public T getA() {
        return a;
    }

    public void setA(T a) {
        this.a = a;
    }

    public T getB() {
        return b;
    }

    public void setB(T b) {
        this.b = b;
    }
}
public class App {
    public static void main(String[] args) {
        // raw
//        Foo<A> f = new Foo();
//        Foo<B> f2 = new Foo();
        Foo<C> f3 = new Foo();
        Foo<D> f4 = new Foo();
        Foo<E> f5 = new Foo();
    }
}
